package css.sword.annotation.kafka;

import java.io.Closeable;

import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

/**
 * 
 *
 * @project 深圳智能政务办公系统
 * @package zhbg.oaxt.common.kafka
 * @file OAKafkaPool.java 创建时间:2018年12月6日下午2:30:36
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2018 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @author  曹敏
 * @reviewer 审核人
 * @param <T>
 * @version 1.0
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 *
 */
public abstract class OAKafkaPool<T> implements Closeable {
    /**连接池 */
    protected GenericObjectPool<T> internalPool;
    /**连接池工厂 */
    protected PooledObjectFactory<T> factory;
    /**
     * 
     *@constructor 构造方法
     */
    public OAKafkaPool() {
    }

    /**
     * 
     *@constructor 构造方法
     *@param poolConfig 参数1
     *@param factory  参数2
     */
    public OAKafkaPool(GenericObjectPoolConfig poolConfig, PooledObjectFactory<T> factory) {
        initPool(poolConfig, factory);
    }
    
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:31:20
     * @author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public void close() {
        try {
            closeInternalPool();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:31:29
     *@return 返回值
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public boolean isClosed() {
        return this.internalPool.isClosed();
    }

    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:35:40
     *@param poolConfig 参数
     *@param factory 参数
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void initPool(GenericObjectPoolConfig poolConfig, PooledObjectFactory<T> factory) {
        if (this.internalPool != null) {
            try {
                closeInternalPool();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        this.internalPool = new GenericObjectPool(factory, poolConfig);
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:36:33
     *@return 返回值
     *@throws Exception
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public T getResource() throws Exception {
        try {
            return this.internalPool.borrowObject();
        } catch (Exception e) {
            throw new Exception("Could not get a resource from the pool", e);
        }
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:36:51
     *@param resource 返回值
     *@throws Exception
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public void returnResourceObject(T resource) throws Exception {
        if (resource == null) {
            return;
        }
        try {
            this.internalPool.returnObject(resource);
        } catch (Exception e) {
            throw new Exception("Could not return the resource to the pool", e);
        }
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:37:08
     *@param resource 参数
     *@throws Exception 参数
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public void returnBrokenResource(T resource) throws Exception {
        if (resource != null) {
            returnBrokenResourceObject(resource);
        }
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:37:38
     *@param resource 参数
     *@throws Exception 参数
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public void returnResource(T resource) throws Exception {
        if (resource != null) {
            returnResourceObject(resource);
        }
    }
    /**
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:37:49
     *@throws Exception
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    public void destroy() throws Exception {
        closeInternalPool();
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:38:01
     *@param resource 参数
     *@throws Exception 参数
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    protected void returnBrokenResourceObject(T resource) throws Exception {
        try {
            this.internalPool.invalidateObject(resource);
        } catch (Exception e) {
            throw new Exception("Could not return the resource to the pool", e);
        }
    }
    /**
     * 
     *@name    中文名称
     *@description 相关说明
     *@time    创建时间:2018年12月6日下午2:38:12
     *@throws Exception 参数
     *@author   曹敏
     *@history 修订历史（历次修订内容、修订人、修订时间等）
     */
    protected void closeInternalPool() throws Exception {
        try {
            this.internalPool.close();
        } catch (Exception e) {
            throw new Exception("Could not destroy the pool", e);
        }
    }
}
